home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 16
/
Aminet 16 (1996)(GTI - Schatztruhe)[!][Dec 1996].iso
/
Aminet
/
comm
/
term
/
term_source.lha
/
Extras
/
Source
/
term-source.lha
/
Capture.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-10-20
|
9KB
|
531 lines
/*
** Capture.c
**
** File and printer capture support routines
**
** Copyright © 1990-1996 by Olaf `Olsen' Barthel
** All Rights Reserved
**
** :ts=4
*/
#ifndef _GLOBAL_H
#include "Global.h"
#endif
STATIC VOID
CaptureCallback1(APTR Buffer,LONG Size)
{
AddLine(Buffer,Size);
CaptureToFile(Buffer,Size);
CaptureToFile("\n",1);
}
STATIC VOID
CaptureCallback3(APTR Buffer,LONG Size)
{
AddLine(Buffer,Size);
CaptureToFile(Buffer,Size);
CaptureToFile("\n",1);
CaptureToPrinter(Buffer,Size);
CaptureToPrinter("\n",1);
}
STATIC VOID
CaptureCallback4(APTR Buffer,LONG Size)
{
CaptureToFile(Buffer,Size);
CaptureToFile("\n",1);
}
STATIC VOID
CaptureCallback5(APTR Buffer,LONG Size)
{
CaptureToFile(Buffer,Size);
CaptureToFile("\n",1);
CaptureToPrinter(Buffer,Size);
CaptureToPrinter("\n",1);
}
STATIC VOID
CaptureCallback6(APTR Buffer,LONG Size)
{
CaptureToPrinter(Buffer,Size);
CaptureToPrinter("\n",1);
}
STATIC VOID
CaptureCallback7(APTR Buffer,LONG Size)
{
AddLine(Buffer,Size);
CaptureToPrinter(Buffer,Size);
CaptureToPrinter("\n",1);
}
VOID
CaptureFilteredTo_Buffer(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)AddLine);
}
VOID
CaptureFilteredTo_Buffer_File(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)CaptureCallback1);
}
VOID
CaptureFilteredTo_Buffer_File_Printer(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)CaptureCallback3);
}
VOID
CaptureFilteredTo_File(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)CaptureCallback4);
}
VOID
CaptureFilteredTo_File_Printer(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)CaptureCallback5);
}
VOID
CaptureFilteredTo_Printer(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)CaptureCallback6);
}
VOID
CaptureFilteredTo_Buffer_Printer(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)CaptureCallback7);
}
VOID
CaptureRawTo_Buffer(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)AddLine);
}
VOID
CaptureRawTo_Buffer_File(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)AddLine);
CaptureToFile(Buffer,Size);
}
VOID
CaptureRawTo_Buffer_File_Printer(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)AddLine);
CaptureToFile(Buffer,Size);
CaptureToPrinter(Buffer,Size);
}
VOID
CaptureRawTo_Buffer_Printer(APTR Buffer,LONG Size)
{
CaptureParser(ParserStuff,Buffer,Size,(COPTR)AddLine);
CaptureToPrinter(Buffer,Size);
}
VOID
CaptureRawTo_File(APTR Buffer,LONG Size)
{
CaptureToFile(Buffer,Size);
}
VOID
CaptureRawTo_File_Printer(APTR Buffer,LONG Size)
{
CaptureToFile(Buffer,Size);
CaptureToPrinter(Buffer,Size);
}
VOID
CaptureRawTo_Printer(APTR Buffer,LONG Size)
{
CaptureToPrinter(Buffer,Size);
}
/* ClosePrinterCapture(BOOL Force):
*
* Closes printer capture file.
*/
VOID
ClosePrinterCapture(BOOL Force)
{
if(PrinterCapture)
{
if(ControllerActive && StandardPrinterCapture && !Force)
FPrintf(PrinterCapture,LocaleString(MSG_CONSOLE_TERMINAL_TRANSCRIPT_ENDING_TXT));
if(Force)
{
Close(PrinterCapture);
CheckItem(MEN_CAPTURE_TO_PRINTER,FALSE);
PrinterCapture = NULL;
ConOutputUpdate();
StandardPrinterCapture = FALSE;
}
}
ControllerActive = FALSE;
ConOutputUpdate();
}
/* OpenPrinterCapture(BOOL Controller):
*
* Opens printer capture file.
*/
BOOL
OpenPrinterCapture(BOOL Controller)
{
if(PrinterCapture)
{
if(Controller && !ControllerActive)
{
ControllerActive = TRUE;
ConOutputUpdate();
FPrintf(PrinterCapture,LocaleString(MSG_CONSOLE_TERMINAL_TRANSCRIPT_FOLLOWS_TXT));
}
return(TRUE);
}
else
{
if(PrinterCapture = Open("PRT:",MODE_NEWFILE))
CheckItem(MEN_CAPTURE_TO_PRINTER,TRUE);
else
{
CheckItem(MEN_CAPTURE_TO_PRINTER,FALSE);
BlockWindows();
ShowRequest(Window,LocaleString(MSG_TERMMAIN_ERROR_OPENING_PRINTER_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),"PRT:");
ReleaseWindows();
}
if(Controller)
{
ControllerActive = TRUE;
StandardPrinterCapture = FALSE;
}
else
{
StandardPrinterCapture = FALSE;
if(ControllerActive)
FPrintf(PrinterCapture,LocaleString(MSG_CONSOLE_USER_TERMINAL_TRANSCRIPT_FOLLOWS_TXT));
}
ConOutputUpdate();
if(PrinterCapture)
return(TRUE);
else
return(FALSE);
}
}
/* CloseFileCapture():
*
* Close the capture file.
*/
VOID
CloseFileCapture()
{
if(FileCapture)
{
BufferClose(FileCapture);
FileCapture = NULL;
if(!GetFileSize(CaptureName))
DeleteFile(CaptureName);
else
{
AddProtection(CaptureName,FIBF_EXECUTE);
if(Config->MiscConfig->CreateIcons)
AddIcon(CaptureName,FILETYPE_TEXT,FALSE);
}
}
CheckItem(MEN_CAPTURE_TO_FILE,FALSE);
CheckItem(MEN_CAPTURE_TO_RAW_FILE,FALSE);
RawCapture = FALSE;
ConOutputUpdate();
}
/* OpenFileCapture():
*
* Open a capture file.
*/
BOOL
OpenFileCapture(BOOL Raw)
{
UBYTE DummyBuffer[MAX_FILENAME_LENGTH];
struct FileRequester *FileRequest;
BOOL Aborted;
Aborted = FALSE;
CloseFileCapture();
BlockWindows();
if(!CaptureName[0])
{
strcpy(CaptureName,Config->CaptureConfig->CapturePath);
if(!AddPart(CaptureName,LocaleString(MSG_DIALPANEL_CAPTURE_NAME_TXT),sizeof(CaptureName)))
CaptureName[0] = 0;
}
strcpy(DummyBuffer,CaptureName);
if(FileRequest = SaveFile(Window,LocaleString(MSG_TERMMAIN_CAPTURE_TO_DISK_TXT),NULL,NULL,DummyBuffer,sizeof(DummyBuffer)))
{
FreeAslRequest(FileRequest);
if(GetFileSize(DummyBuffer))
{
switch(ShowRequest(Window,LocaleString(MSG_GLOBAL_FILE_ALREADY_EXISTS_TXT),LocaleString(MSG_GLOBAL_CREATE_APPEND_CANCEL_TXT),DummyBuffer))
{
case 0:
FileCapture = NULL;
Aborted = TRUE;
break;
case 1:
FileCapture = BufferOpen(DummyBuffer,"w");
break;
case 2:
FileCapture = BufferOpen(DummyBuffer,"a");
break;
}
}
else
FileCapture = BufferOpen(DummyBuffer,"w");
if(!Aborted)
{
if(!FileCapture)
ShowError(Window,ERR_SAVE_ERROR,IoErr(),DummyBuffer);
else
strcpy(CaptureName,DummyBuffer);
}
}
if(Raw)
{
if(FileCapture)
CheckItem(MEN_CAPTURE_TO_RAW_FILE,TRUE);
else
CheckItem(MEN_CAPTURE_TO_RAW_FILE,FALSE);
RawCapture = TRUE;
}
else
{
if(FileCapture)
CheckItem(MEN_CAPTURE_TO_FILE,TRUE);
else
CheckItem(MEN_CAPTURE_TO_FILE,FALSE);
RawCapture = FALSE;
}
ConOutputUpdate();
ReleaseWindows();
if(FileCapture)
return(TRUE);
else
return(FALSE);
}
/* CaptureToFile(APTR Buffer,LONG Size):
*
* Send data to the capture file.
*/
VOID
CaptureToFile(APTR Buffer,LONG Size)
{
if(Size)
{
if(BufferWrite(FileCapture,Buffer,Size) != Size)
{
BlockWindows();
/* We had an error writing to the file. */
switch(ShowRequest(NULL,LocaleString(MSG_CONSOLE_ERROR_WRITING_TO_CAPTURE_FILE_TXT),LocaleString(MSG_CONSOLE_IGNORE_DISCARD_CLOSE_TXT),CaptureName))
{
case 1:
BufferClose(FileCapture);
DeleteFile(CaptureName);
CheckItem(MEN_CAPTURE_TO_FILE,FALSE);
FileCapture = NULL;
ConOutputUpdate();
break;
case 2:
BufferClose(FileCapture);
CheckItem(MEN_CAPTURE_TO_FILE,FALSE);
FileCapture = NULL;
if(!GetFileSize(CaptureName))
DeleteFile(CaptureName);
else
{
AddProtection(CaptureName,FIBF_EXECUTE);
if(Config->MiscConfig->CreateIcons)
AddIcon(CaptureName,FILETYPE_TEXT,FALSE);
}
ConOutputUpdate();
break;
}
ReleaseWindows();
}
}
}
/* CaptureToPrinter(APTR Buffer,LONG Size):
*
* Send capture data to the printer, convert the
* characters as necessary to avoid shocking the
* printer.
*/
VOID
CaptureToPrinter(APTR Buffer,LONG Size)
{
if(!Config->CaptureConfig->ConvertChars && Config->TerminalConfig->FontMode != FONT_STANDARD)
{
UBYTE LocalBuffer[BUFFER_LINE_MAX];
UBYTE *Src,*Dst,c;
ULONG Count;
Src = Buffer;
while(Size > 0)
{
Count = MIN(Size,BUFFER_LINE_MAX);
Size -= Count;
Dst = LocalBuffer;
do
{
if(c = ISOConversion[*Src++])
*Dst++ = c;
else
*Dst++ = ' ';
}
while(--Count > 0);
Count = (ULONG)Dst - (ULONG)&LocalBuffer[0];
while(Count > 0 && LocalBuffer[Count - 1] == ' ')
Count--;
if(Count > 0)
{
if(Write(PrinterCapture,LocalBuffer,Count) != Count)
{
BlockWindows();
if(!ShowRequest(Window,LocaleString(MSG_CONSOLE_ERROR_WRITING_TO_PRINTER_TXT),LocaleString(MSG_CONSOLE_IGNORE_CLOSE_PRINTER_TXT)))
{
Close(PrinterCapture);
CheckItem(MEN_CAPTURE_TO_PRINTER,FALSE);
PrinterCapture = NULL;
ConOutputUpdate();
Size = 0;
}
ReleaseWindows();
}
}
}
}
else
{
if(Size > 0)
{
/* Send the buffer to the printer. */
if(Write(PrinterCapture,Buffer,Size) != Size)
{
BlockWindows();
if(!ShowRequest(Window,LocaleString(MSG_CONSOLE_ERROR_WRITING_TO_PRINTER_TXT),LocaleString(MSG_CONSOLE_IGNORE_CLOSE_PRINTER_TXT)))
{
Close(PrinterCapture);
CheckItem(MEN_CAPTURE_TO_PRINTER,FALSE);
PrinterCapture = NULL;
ConOutputUpdate();
}
ReleaseWindows();
}
}
}
}